var transliterate = (function () {
	'use strict';

	/**
	* Сопоставления русских и латинских символов, сгруппированные по типам (системам) транслитерации
	*
	* @private {Object}
	*/
	var characterMappings = {
		// Основной
		'basic': {
			'а': 'a',
			'б': 'b',
			'в': 'v',
			'г': 'g',
			'д': 'd',
			'е': 'e',
			'ё': 'jo',
			'ж': 'zh',
			'з': 'z',
			'и': 'i',
			'й': 'j',
			'к': 'k',
			'л': 'l',
			'м': 'm',
			'н': 'n',
			'о': 'o',
			'п': 'p',
			'р': 'r',
			'с': 's',
			'т': 't',
			'у': 'u',
			'ф': 'f',
			'х': 'h',
			'ц': 'c',
			'ч': 'ch',
			'ш': 'sh',
			'щ': 'shh',
			'ъ': '#',
			'ы': 'y',
			'ь': '\'',
			'э': 'je',
			'ю': 'ju',
			'я': 'ja',
			'А': 'A',
			'Б': 'B',
			'В': 'V',
			'Г': 'G',
			'Д': 'D',
			'Е': 'E',
			'Ё': 'Jo',
			'Ж': 'Zh',
			'З': 'Z',
			'И': 'I',
			'Й': 'J',
			'К': 'K',
			'Л': 'L',
			'М': 'M',
			'Н': 'N',
			'О': 'O',
			'П': 'P',
			'Р': 'R',
			'С': 'S',
			'Т': 'T',
			'У': 'U',
			'Ф': 'F',
			'Х': 'H',
			'Ц': 'C',
			'Ч': 'Ch',
			'Ш': 'Sh',
			'Щ': 'Shh',
			'Ъ': '##',
			'Ы': 'Y',
			'Ь': '\'\'',
			'Э': 'Je',
			'Ю': 'Ju',
			'Я': 'Ja'
		},

		// Буквы-цифры
		'letters-numbers': {
			'а': 'a',
			'б': 'b',
			'в': 'v',
			'г': 'g',
			'д': 'd',
			'е': 'e',
			'ё': 'jo',
			'ж': '#',
			'з': 'z',
			'и': 'i',
			'й': 'j',
			'к': 'k',
			'л': 'l',
			'м': 'm',
			'н': 'n',
			'о': 'o',
			'п': 'p',
			'р': 'r',
			'с': 's',
			'т': 't',
			'у': 'u',
			'ф': 'f',
			'х': 'h',
			'ц': 'c',
			'ч': '4',
			'ш': '6',
			'щ': 'sch',
			'ъ': '*',
			'ы': 'y',
			'ь': '\'',
			'э': 'je',
			'ю': 'ju',
			'я': 'ja',
			'А': 'A',
			'Б': 'B',
			'В': 'V',
			'Г': 'G',
			'Д': 'D',
			'Е': 'E',
			'Ё': 'Jo',
			'Ж': '##',
			'З': 'Z',
			'И': 'I',
			'Й': 'J',
			'К': 'K',
			'Л': 'L',
			'М': 'M',
			'Н': 'N',
			'О': 'O',
			'П': 'P',
			'Р': 'R',
			'С': 'S',
			'Т': 'T',
			'У': 'U',
			'Ф': 'F',
			'Х': 'H',
			'Ц': 'C',
			'Ч': '44',
			'Ш': '66',
			'Щ': 'Sch',
			'Ъ': '**',
			'Ы': 'Y',
			'Ь': '\'\'',
			'Э': 'Je',
			'Ю': 'Ju',
			'Я': 'Ja'
		},

		// ГОСТ 16876-71
		'gost-16876-71': {
			'а': 'a',
			'б': 'b',
			'в': 'v',
			'г': 'g',
			'д': 'd',
			'е': 'e',
			'ё': 'jo',
			'ж': 'zh',
			'з': 'z',
			'и': 'i',
			'й': 'jj',
			'к': 'k',
			'л': 'l',
			'м': 'm',
			'н': 'n',
			'о': 'o',
			'п': 'p',
			'р': 'r',
			'с': 's',
			'т': 't',
			'у': 'u',
			'ф': 'f',
			'х': 'kh',
			'ц': 'c',
			'ч': 'ch',
			'ш': 'sh',
			'щ': 'shh',
			'ъ': '"',
			'ы': 'y',
			'ь': '\'',
			'э': 'eh',
			'ю': 'ju',
			'я': 'ja',
			'А': 'A',
			'Б': 'B',
			'В': 'V',
			'Г': 'G',
			'Д': 'D',
			'Е': 'E',
			'Ё': 'Jo',
			'Ж': 'Zh',
			'З': 'Z',
			'И': 'I',
			'Й': 'Jj',
			'К': 'K',
			'Л': 'L',
			'М': 'M',
			'Н': 'N',
			'О': 'O',
			'П': 'P',
			'Р': 'R',
			'С': 'S',
			'Т': 'T',
			'У': 'U',
			'Ф': 'F',
			'Х': 'Kh',
			'Ц': 'C',
			'Ч': 'Ch',
			'Ш': 'Sh',
			'Щ': 'Shh',
			'Ъ': '""',
			'Ы': 'Y',
			'Ь': '\'\'',
			'Э': 'Eh',
			'Ю': 'Ju',
			'Я': 'Ja'
		},

		// ГОСТ 7.79-2000
		'gost-7-79-2000': {
			'а': 'a',
			'б': 'b',
			'в': 'v',
			'г': 'g',
			'д': 'd',
			'е': 'e',
			'ё': 'yo',
			'ж': 'zh',
			'з': 'z',
			'и': 'i',
			'й': 'j',
			'к': 'k',
			'л': 'l',
			'м': 'm',
			'н': 'n',
			'о': 'o',
			'п': 'p',
			'р': 'r',
			'с': 's',
			'т': 't',
			'у': 'u',
			'ф': 'f',
			'х': 'x',
			'ц': 'c',
			'ч': 'ch',
			'ш': 'sh',
			'щ': 'shh',
			'ъ': '"',
			'ы': 'y',
			'ь': '\'',
			'э': 'e\'',
			'ю': 'yu',
			'я': 'ya',
			'А': 'A',
			'Б': 'B',
			'В': 'V',
			'Г': 'G',
			'Д': 'D',
			'Е': 'E',
			'Ё': 'Yo',
			'Ж': 'Zh',
			'З': 'Z',
			'И': 'I',
			'Й': 'J',
			'К': 'K',
			'Л': 'L',
			'М': 'M',
			'Н': 'N',
			'О': 'O',
			'П': 'P',
			'Р': 'R',
			'С': 'S',
			'Т': 'T',
			'У': 'U',
			'Ф': 'F',
			'Х': 'X',
			'Ц': 'C',
			'Ч': 'Ch',
			'Ш': 'Sh',
			'Щ': 'Shh',
			'Ъ': '""',
			'Ы': 'Y',
			'Ь': '\'\'',
			'Э': 'E\'',
			'Ю': 'Yu',
			'Я': 'Ya'
		},

		// СЭВ 1362-78
		'sev-1362-78': {
			'а': 'a',
			'б': 'b',
			'в': 'v',
			'г': 'g',
			'д': 'd',
			'е': 'e',
			'ё': 'jo',
			'ж': 'zh',
			'з': 'z',
			'и': 'i',
			'й': 'j',
			'к': 'k',
			'л': 'l',
			'м': 'm',
			'н': 'n',
			'о': 'o',
			'п': 'p',
			'р': 'r',
			'с': 's',
			'т': 't',
			'у': 'u',
			'ф': 'f',
			'х': 'kh',
			'ц': 'c',
			'ч': 'ch',
			'ш': 'sh',
			'щ': 'shh',
			'ъ': '"',
			'ы': 'y',
			'ь': '\'',
			'э': 'eh',
			'ю': 'ju',
			'я': 'ja',
			'А': 'A',
			'Б': 'B',
			'В': 'V',
			'Г': 'G',
			'Д': 'D',
			'Е': 'E',
			'Ё': 'Jo',
			'Ж': 'Zh',
			'З': 'Z',
			'И': 'I',
			'Й': 'J',
			'К': 'K',
			'Л': 'L',
			'М': 'M',
			'Н': 'N',
			'О': 'O',
			'П': 'P',
			'Р': 'R',
			'С': 'S',
			'Т': 'T',
			'У': 'U',
			'Ф': 'F',
			'Х': 'Kh',
			'Ц': 'C',
			'Ч': 'Ch',
			'Ш': 'Sh',
			'Щ': 'Shh',
			'Ъ': '""',
			'Ы': 'Y',
			'Ь': '\'\'',
			'Э': 'Eh',
			'Ю': 'Ju',
			'Я': 'Ja'
		},

		// ISO 9:1995
		'iso-9-1995': {
			'а': 'a',
			'б': 'b',
			'в': 'v',
			'г': 'g',
			'д': 'd',
			'е': 'e',
			'ё': 'ë',
			'ж': 'ž',
			'з': 'z',
			'и': 'i',
			'й': 'j',
			'к': 'k',
			'л': 'l',
			'м': 'm',
			'н': 'n',
			'о': 'o',
			'п': 'p',
			'р': 'r',
			'с': 's',
			'т': 't',
			'у': 'u',
			'ф': 'f',
			'х': 'h',
			'ц': 'c',
			'ч': 'č',
			'ш': 'š',
			'щ': 'ŝ',
			'ъ': '"',
			'ы': 'y',
			'ь': '\'',
			'э': 'è',
			'ю': 'û',
			'я': 'â',
			'А': 'A',
			'Б': 'B',
			'В': 'V',
			'Г': 'G',
			'Д': 'D',
			'Е': 'E',
			'Ё': 'Ë',
			'Ж': 'Ž',
			'З': 'Z',
			'И': 'I',
			'Й': 'J',
			'К': 'K',
			'Л': 'L',
			'М': 'M',
			'Н': 'N',
			'О': 'O',
			'П': 'P',
			'Р': 'R',
			'С': 'S',
			'Т': 'T',
			'У': 'U',
			'Ф': 'F',
			'Х': 'H',
			'Ц': 'C',
			'Ч': 'Č',
			'Ш': 'Š',
			'Щ': 'Ŝ',
			'Ъ': '"',
			'Ы': 'Y',
			'Ь': '\'',
			'Э': 'È',
			'Ю': 'Û',
			'Я': 'Â'
		},

		// LC
		'lc': {
			'а': 'a',
			'б': 'b',
			'в': 'v',
			'г': 'g',
			'д': 'd',
			'е': 'e',
			'ё': 'e',
			'ж': 'zh',
			'з': 'z',
			'и': 'i',
			'й': 'i',
			'к': 'k',
			'л': 'l',
			'м': 'm',
			'н': 'n',
			'о': 'o',
			'п': 'p',
			'р': 'r',
			'с': 's',
			'т': 't',
			'у': 'u',
			'ф': 'f',
			'х': 'kh',
			'ц': 'ts',
			'ч': 'ch',
			'ш': 'sh',
			'щ': 'shch',
			'ъ': '"',
			'ы': 'y',
			'ь': '\'',
			'э': 'e',
			'ю': 'iu',
			'я': 'ia',
			'А': 'A',
			'Б': 'B',
			'В': 'V',
			'Г': 'G',
			'Д': 'D',
			'Е': 'E',
			'Ё': 'E',
			'Ж': 'Zh',
			'З': 'Z',
			'И': 'I',
			'Й': 'I',
			'К': 'K',
			'Л': 'L',
			'М': 'M',
			'Н': 'N',
			'О': 'O',
			'П': 'P',
			'Р': 'R',
			'С': 'S',
			'Т': 'T',
			'У': 'U',
			'Ф': 'F',
			'Х': 'Kh',
			'Ц': 'Ts',
			'Ч': 'Ch',
			'Ш': 'Sh',
			'Щ': 'Shch',
			'Ъ': '""',
			'Ы': 'Y',
			'Ь': '\'\'',
			'Э': 'E',
			'Ю': 'Iu',
			'Я': 'Ia'
		},

		// BGN
		'bgn': {
			'а': 'a',
			'б': 'b',
			'в': 'v',
			'г': 'g',
			'д': 'd',
			'е': 'e',
			'ё': 'e',
			'ж': 'zh',
			'з': 'z',
			'и': 'i',
			'й': 'y',
			'к': 'k',
			'л': 'l',
			'м': 'm',
			'н': 'n',
			'о': 'o',
			'п': 'p',
			'р': 'r',
			'с': 's',
			'т': 't',
			'у': 'u',
			'ф': 'f',
			'х': 'kh',
			'ц': 'ts',
			'ч': 'ch',
			'ш': 'sh',
			'щ': 'shch',
			'ъ': '"',
			'ы': 'y',
			'ь': '\'',
			'э': 'e',
			'ю': 'yu',
			'я': 'ya',
			'А': 'A',
			'Б': 'B',
			'В': 'V',
			'Г': 'G',
			'Д': 'D',
			'Е': 'E',
			'Ё': 'E',
			'Ж': 'Zh',
			'З': 'Z',
			'И': 'I',
			'Й': 'Y',
			'К': 'K',
			'Л': 'L',
			'М': 'M',
			'Н': 'N',
			'О': 'O',
			'П': 'P',
			'Р': 'R',
			'С': 'S',
			'Т': 'T',
			'У': 'U',
			'Ф': 'F',
			'Х': 'Kh',
			'Ц': 'Ts',
			'Ч': 'Ch',
			'Ш': 'Sh',
			'Щ': 'Shch',
			'Ъ': '""',
			'Ы': 'Y',
			'Ь': '\'\'',
			'Э': 'E',
			'Ю': 'Yu',
			'Я': 'Ya'
		},

		// BSI
		'bsi': {
			'а': 'a',
			'б': 'b',
			'в': 'v',
			'г': 'g',
			'д': 'd',
			'е': 'e',
			'ё': 'e',
			'ж': 'zh',
			'з': 'z',
			'и': 'i',
			'й': 'i',
			'к': 'k',
			'л': 'l',
			'м': 'm',
			'н': 'n',
			'о': 'o',
			'п': 'p',
			'р': 'r',
			'с': 's',
			'т': 't',
			'у': 'u',
			'ф': 'f',
			'х': 'kh',
			'ц': 'ts',
			'ч': 'ch',
			'ш': 'sh',
			'щ': 'shch',
			'ъ': '"',
			'ы': 'y',
			'ь': '\'',
			'э': 'e',
			'ю': 'yu',
			'я': 'ya',
			'А': 'A',
			'Б': 'B',
			'В': 'V',
			'Г': 'G',
			'Д': 'D',
			'Е': 'E',
			'Ё': 'E',
			'Ж': 'Zh',
			'З': 'Z',
			'И': 'I',
			'Й': 'I',
			'К': 'K',
			'Л': 'L',
			'М': 'M',
			'Н': 'N',
			'О': 'O',
			'П': 'P',
			'Р': 'R',
			'С': 'S',
			'Т': 'T',
			'У': 'U',
			'Ф': 'F',
			'Х': 'Kh',
			'Ц': 'Ts',
			'Ч': 'Ch',
			'Ш': 'Sh',
			'Щ': 'Shch',
			'Ъ': '""',
			'Ы': 'Y',
			'Ь': '\'\'',
			'Э': 'E',
			'Ю': 'Yu',
			'Я': 'Ya'
		},

		// Сходно с МВД
		'police': {
			'а': 'a',
			'б': 'b',
			'в': 'v',
			'г': 'g',
			'д': 'd',
			'е': 'e',
			'ё': 'e',
			'ж': 'zh',
			'з': 'z',
			'и': 'i',
			'й': 'i',
			'к': 'k',
			'л': 'l',
			'м': 'm',
			'н': 'n',
			'о': 'o',
			'п': 'p',
			'р': 'r',
			'с': 's',
			'т': 't',
			'у': 'u',
			'ф': 'f',
			'х': 'kh',
			'ц': 'ts',
			'ч': 'ch',
			'ш': 'sh',
			'щ': 'shch',
			'ъ': 'ie',
			'ы': 'y',
			'ь': '',
			'э': 'e',
			'ю': 'iu',
			'я': 'ia',
			'А': 'A',
			'Б': 'B',
			'В': 'V',
			'Г': 'G',
			'Д': 'D',
			'Е': 'E',
			'Ё': 'E',
			'Ж': 'Zh',
			'З': 'Z',
			'И': 'I',
			'Й': 'I',
			'К': 'K',
			'Л': 'L',
			'М': 'M',
			'Н': 'N',
			'О': 'O',
			'П': 'P',
			'Р': 'R',
			'С': 'S',
			'Т': 'T',
			'У': 'U',
			'Ф': 'F',
			'Х': 'Kh',
			'Ц': 'Ts',
			'Ч': 'Ch',
			'Ш': 'Sh',
			'Щ': 'Shch',
			'Ъ': 'Ie',
			'Ы': 'Y',
			'Ь': '',
			'Э': 'E',
			'Ю': 'Iu',
			'Я': 'Ia'
		},

		// Как на загранпаспорт
		'foreign-passport': {
			'а': 'a',
			'б': 'b',
			'в': 'v',
			'г': 'g',
			'д': 'd',
			'е': 'e',
			'ё': 'e',
			'ж': 'zh',
			'з': 'z',
			'и': 'i',
			'й': 'i',
			'к': 'k',
			'л': 'l',
			'м': 'm',
			'н': 'n',
			'о': 'o',
			'п': 'p',
			'р': 'r',
			'с': 's',
			'т': 't',
			'у': 'u',
			'ф': 'f',
			'х': 'kh',
			'ц': 'tc',
			'ч': 'ch',
			'ш': 'sh',
			'щ': 'shch',
			'ъ': '',
			'ы': 'y',
			'ь': '',
			'э': 'e',
			'ю': 'iu',
			'я': 'ia',
			'А': 'A',
			'Б': 'B',
			'В': 'V',
			'Г': 'G',
			'Д': 'D',
			'Е': 'E',
			'Ё': 'E',
			'Ж': 'Zh',
			'З': 'Z',
			'И': 'I',
			'Й': 'I',
			'К': 'K',
			'Л': 'L',
			'М': 'M',
			'Н': 'N',
			'О': 'O',
			'П': 'P',
			'Р': 'R',
			'С': 'S',
			'Т': 'T',
			'У': 'U',
			'Ф': 'F',
			'Х': 'Kh',
			'Ц': 'Tc',
			'Ч': 'Ch',
			'Ш': 'Sh',
			'Щ': 'Shch',
			'Ъ': '',
			'Ы': 'Y',
			'Ь': '',
			'Э': 'E',
			'Ю': 'Iu',
			'Я': 'Ia'
		},

		// Международные телеграммы
		'international-telegrams': {
			'а': 'a',
			'б': 'b',
			'в': 'v',
			'г': 'g',
			'д': 'd',
			'е': 'e',
			'ё': 'e',
			'ж': 'j',
			'з': 'z',
			'и': 'i',
			'й': 'i',
			'к': 'k',
			'л': 'l',
			'м': 'm',
			'н': 'n',
			'о': 'o',
			'п': 'p',
			'р': 'r',
			'с': 's',
			'т': 't',
			'у': 'u',
			'ф': 'f',
			'х': 'h',
			'ц': 'c',
			'ч': 'ch',
			'ш': 'sh',
			'щ': 'sc',
			'ъ': '',
			'ы': 'y',
			'ь': '',
			'э': 'e',
			'ю': 'iu',
			'я': 'ia',
			'А': 'A',
			'Б': 'B',
			'В': 'V',
			'Г': 'G',
			'Д': 'D',
			'Е': 'E',
			'Ё': 'E',
			'Ж': 'J',
			'З': 'Z',
			'И': 'I',
			'Й': 'I',
			'К': 'K',
			'Л': 'L',
			'М': 'M',
			'Н': 'N',
			'О': 'O',
			'П': 'P',
			'Р': 'R',
			'С': 'S',
			'Т': 'T',
			'У': 'U',
			'Ф': 'F',
			'Х': 'H',
			'Ц': 'C',
			'Ч': 'Ch',
			'Ш': 'Sh',
			'Щ': 'Sc',
			'Ъ': '',
			'Ы': 'Y',
			'Ь': '',
			'Э': 'E',
			'Ю': 'Iu',
			'Я': 'Ia'
		}
	};

	function toYandexFriendlyUrl(value) {
		var processedValue,
			result
			;

		processedValue = value.toLowerCase();
		result = processedValue.replace(/([а-яё])|([\s_-])|([^a-z\d])/gi,
			function (all, charValue, space, special, offset) {
				var replacements,
					charCode,
					index,
					transliteratedCharValue
					;

				if (space) {
					return '-';
				}

				if (special) {
					return '';
				}

				replacements = ['yo', 'a', 'b', 'v', 'g', 'd', 'e', 'zh',
					'z', 'i', 'y', 'k', 'l', 'm', 'n', 'o', 'p',
					'r', 's', 't', 'u', 'f', 'h', 'c', 'ch', 'sh',
					'shch', '', 'y', '', 'e', 'yu', 'ya'];

				charCode = charValue.charCodeAt(0);
				if (charCode == 1025 || charCode == 1105) {
					index = 0;
				}
				else {
					index = charCode > 1071 ? charCode - 1071 : charCode - 1039;
				}

				transliteratedCharValue = replacements[index];

				return transliteratedCharValue;
			}
		);

		return result;
	}

	/**
	* Производит транслитерацию русского текста с кириллицы на латиницу
	*
	* @param {String} value - Текст, содержащий символы русского (кириллического) алфавита
	* @param {String} type - Код типа (системы) транслитерации
	* @returns {String} Текст, содержащий только символы латинского алфавита
	* @expose
	*/
	function transliterate(value, type) {
		var charCount,
			charIndex,
			charValue,
			newCharValue,
			characterMapping,
			result
			;

		value = value || '';
		type = type || 'basic';

		charCount = value.length;
		if (charCount === 0) {
			return value;
		}

		if (type === 'yandex-friendly-url') {
			return toYandexFriendlyUrl(value);
		}

		characterMapping = characterMappings[type];
		if (typeof characterMapping === 'undefined') {
			return value;
		}

		result = '';

		for (charIndex = 0; charIndex < charCount; charIndex++) {
			charValue = value.charAt(charIndex);
			newCharValue = typeof characterMapping[charValue] !== 'undefined' ?
				characterMapping[charValue] : charValue;
			result += newCharValue;
		}

		return result;
	}

	return transliterate;
}());